package baiduface

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
	"time"
)

// NewFaceDetectRequest 创建一个人脸检测请求参数实例并设置默认值
func NewFaceDetectRequest(image, imageType string) *FaceDetectRequest {
	return &FaceDetectRequest{
		Image:            image,
		ImageType:        imageType,
		MaxFaceNum:       1,      // 默认值为1
		FaceType:         "LIVE", // 默认为人脸生活照
		LivenessControl:  "NONE", // 默认不进行活体控制
		FaceSortType:     0,      // 默认按人脸面积从大到小排列
		DisplayCorpImage: 0,      // 默认不显示裁剪图
	}
}

// FaceDetect 人脸检测与属性分析
func FaceDetect(image string) (*FaceDetectResponse, error) {
	// 获取访问令牌
	tokenResp, err := GetAccessToken()
	if err != nil {
		return nil, fmt.Errorf("获取访问令牌失败: %v", err)
	}

	// 构建请求URL
	url := fmt.Sprintf("https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%s", tokenResp.AccessToken)

	// 使用map[string]interface{}构建请求数据
	requestData := map[string]interface{}{
		"image":      image,
		"image_type": "BASE64",
	}

	// 将map转换为JSON
	jsonData, err := json.Marshal(requestData)
	if err != nil {
		return nil, fmt.Errorf("序列化请求数据失败: %v", err)
	}

	// 创建HTTP请求
	payload := strings.NewReader(string(jsonData))
	client := &http.Client{
		Timeout: 30 * time.Second,
	}
	req, err := http.NewRequest("POST", url, payload)
	if err != nil {
		return nil, fmt.Errorf("创建HTTP请求失败: %v", err)
	}

	// 设置请求头
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")

	// 发送请求
	res, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("发送HTTP请求失败: %v", err)
	}
	defer res.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	// 解析响应为FaceDetectResponse结构体
	var result FaceDetectResponse
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, fmt.Errorf("解析响应JSON失败: %v", err)
	}

	return &result, nil
}

// FaceDetectWithRequest 使用FaceDetectRequest结构体进行人脸检测
func FaceDetectWithRequest(req *FaceDetectRequest) (*FaceDetectResponse, error) {
	// 获取访问令牌
	tokenResp, err := GetAccessToken()
	if err != nil {
		return nil, fmt.Errorf("获取访问令牌失败: %v", err)
	}

	// 构建请求URL
	url := fmt.Sprintf("https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%s", tokenResp.AccessToken)

	// 将请求结构体转换为JSON
	jsonData, err := json.Marshal(req)
	if err != nil {
		return nil, fmt.Errorf("序列化请求数据失败: %v", err)
	}

	// 创建HTTP请求
	payload := bytes.NewReader(jsonData)
	client := &http.Client{
		Timeout: 30 * time.Second,
	}
	httpReq, err := http.NewRequest("POST", url, payload)
	if err != nil {
		return nil, fmt.Errorf("创建HTTP请求失败: %v", err)
	}

	// 设置请求头
	httpReq.Header.Add("Content-Type", "application/json")
	httpReq.Header.Add("Accept", "application/json")

	// 发送请求
	res, err := client.Do(httpReq)
	if err != nil {
		return nil, fmt.Errorf("发送HTTP请求失败: %v", err)
	}
	defer res.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	// 解析响应为FaceDetectResponse结构体
	var result FaceDetectResponse
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, fmt.Errorf("解析响应JSON失败: %v", err)
	}

	return &result, nil
}

// FaceDetectWithFullOptions 使用完整选项的人脸检测
func FaceDetectWithFullOptions(image string, imageType string, options map[string]interface{}) (*FaceDetectResponse, error) {
	// 获取访问令牌
	tokenResp, err := GetAccessToken()
	if err != nil {
		return nil, fmt.Errorf("获取访问令牌失败: %v", err)
	}

	// 构建请求URL
	url := fmt.Sprintf("https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%s", tokenResp.AccessToken)

	// 使用map[string]interface{}构建请求数据
	requestData := map[string]interface{}{
		"image":      image,
		"image_type": imageType,
	}

	// 合并传入选项
	for key, value := range options {
		requestData[key] = value
	}

	// 将map转换为JSON
	jsonData, err := json.Marshal(requestData)
	if err != nil {
		return nil, fmt.Errorf("序列化请求数据失败: %v", err)
	}

	// 创建HTTP请求
	payload := bytes.NewReader(jsonData)
	client := &http.Client{
		Timeout: 30 * time.Second,
	}
	httpReq, err := http.NewRequest("POST", url, payload)
	if err != nil {
		return nil, fmt.Errorf("创建HTTP请求失败: %v", err)
	}

	// 设置请求头
	httpReq.Header.Add("Content-Type", "application/json")
	httpReq.Header.Add("Accept", "application/json")

	// 发送请求
	res, err := client.Do(httpReq)
	if err != nil {
		return nil, fmt.Errorf("发送HTTP请求失败: %v", err)
	}
	defer res.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	// 解析响应为FaceDetectResponse结构体
	var result FaceDetectResponse
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, fmt.Errorf("解析响应JSON失败: %v", err)
	}

	return &result, nil
}
